import { translateVar } from '../../../utils/maps/varAbbMap'
export const mixin = {
  methods: {
    translateChinese (key, value, dict = undefined) {
      if (dict !== undefined) {
        return dict[value] === undefined ? value : dict[value]
      } else return translateVar(key, value)
    }
  }
}
// 格式化日期为YYYY-MM-DD hh:mm:ss
export const formatDate = now => {
  let year = now.getFullYear()
  let month = now.getMonth() + 1
  let date = now.getDate()
  let hour = now.getHours()
  let minute = now.getMinutes()
  let second = now.getSeconds()
  return `${year}-${month}-${date} ${hour}:${minute}:${second}`
}
// 详情页数据处理
export const detailInfoStructure = ({ stype, handleData }) => {
  // 监测信息
  const monitor = {
    // 防火墙检测
    WF: [
      { label: '协议', value: handleData.proto },
      { label: '源IP标识', value: handleData.sip },
      { label: '源端口', value: handleData.sport },
      { label: '目的IP标识', value: handleData.dip },
      { label: '目的端口', value: handleData.dport },
      { label: '策略名称', value: handleData.policy },
      { label: '响应动作', value: handleData.action },
      { label: '发送字节', value: handleData.send },
      { label: '接收字节', value: handleData.recvd },
      { label: '源安全域', value: handleData.szone },
      { label: '目的安全域', value: handleData.dzone }
    ],
    // web应用防火墙
    WAF: [
      { label: '原始报文', value: handleData.rawMsg },
      { label: '源IP标识', value: handleData.sip },
      { label: '源端口', value: handleData.sport },
      { label: '目的IP标识', value: handleData.dip },
      { label: '目的端口', value: handleData.dport },
      { label: 'URL', value: handleData.url },
      { label: '事件标签', value: handleData.tag },
      { label: '处置动作', value: handleData.action },
      { label: '客户环境', value: handleData.clientEnv }
    ],
    // 入侵检测
    IDS: [
      { label: '协议', value: handleData.proto },
      { label: '入侵者IP', value: handleData.sip },
      { label: '入侵者端口', value: handleData.sport },
      { label: '被攻击IP标识', value: handleData.dip },
      { label: '被攻击端口', value: handleData.dport },
      { label: '入侵事件描述', value: handleData.desc }
    ],
    // 入侵防御
    IPS: [
      { label: '协议', value: handleData.proto },
      { label: '入侵者IP', value: handleData.sip },
      { label: '入侵者端口', value: handleData.sport },
      { label: '被攻击IP标识', value: handleData.dip },
      { label: '被攻击端口', value: handleData.dport },
      { label: '处置动作', value: handleData.action },
      { label: '入侵防御事件描述', value: handleData.desc }
    ],
    // 恶意代码检测
    MALWARE: [
      { label: '受害主机', value: handleData.host },
      { label: '文件MD5值', value: handleData.md5 },
      { label: '文件名称', value: handleData.filename },
      { label: '恶意代码名称', value: handleData.malname },
      { label: '恶意代码家族', value: handleData.virusFamily },
      { label: '威胁类型', value: handleData.virusType },
      { label: '恶意行为', value: handleData.behavior },
      { label: '处置结果', value: handleData.status === 'clean' ? '已清除' : '未清除' }
    ],
    // C&C通讯
    C2: [
      { label: '受害主机', value: handleData.host },
      { label: '外联通讯地址', value: handleData.url },
      { label: '外联通讯IP', value: handleData.dip },
      { label: '外联通讯端口', value: handleData.port },
      { label: '远控指令内容', value: handleData.msg },
      { label: '传输载荷', value: handleData.md5 },
      { label: '使用的协议', value: handleData.proto }
    ],
    // 载荷深度分析
    LOAD_ANA: [
      { label: '是否恶意', value: handleData.isMalicious },
      { label: '文件名', value: handleData.fileName },
      { label: '文件类型', value: handleData.fileType },
      { label: '文件大小', value: handleData.fileBytes + 'B' },
      { label: 'MD5', value: handleData.fileMd5 },
      { label: '文件格式', value: handleData.fileExt },
      { label: '病毒名称', value: handleData.malname }
      // { label: '威胁行为', value: handleData.dangerBehavior },
      // { label: '文件行为', value: handleData.fileMonitor },
      // { label: '网络行为', value: handleData.networkMonitor }
    ],
    // 恶意代码传输
    MALCODE_TRANSTER: [
      { label: '协议', value: handleData.proto },
      { label: '源IP标识', value: handleData.sip },
      { label: '源端口', value: handleData.sport },
      { label: '目的IP标识', value: handleData.dip },
      { label: '目的端口', value: handleData.dport },
      { label: '通讯url', value: handleData.url },
      { label: '传输载荷', value: handleData.md5 },
      { label: '文件名称', value: handleData.filename },
      { label: '恶意代码名称', value: handleData.malname },
      { label: '恶意行为', value: handleData.behavior }
    ],
    // 脆弱性
    VUL: [
      { label: '设备标识', value: handleData.node },
      { label: 'CVE编号', value: handleData.cveId },
      { label: 'CNNVD编号', value: handleData.cncveId },
      { label: '漏洞名称', value: handleData.vulName },
      { label: '漏洞类型', value: handleData.vulType },
      { label: '漏洞描述', value: handleData.desc },
      { label: '影响内容', value: handleData.affect },
      { label: '漏洞解决方案', value: handleData.solution },
      { label: '处置结果', value: handleData.status === 'fix' ? '已修复' : '未修复' }
    ],
    // 系统漏洞
    OS_VUL: [
      { label: '设备标识', value: handleData.node },
      { label: 'CVE编号', value: handleData.cveId },
      { label: 'CNNVD编号', value: handleData.cncveId },
      { label: '漏洞名称', value: handleData.vulName },
      { label: '漏洞类型', value: handleData.vulType },
      { label: '漏洞描述', value: handleData.desc },
      { label: '影响软件', value: handleData.affectSoftwares },
      { label: '漏洞解决方案', value: handleData.solution },
      { label: '服务名称', value: handleData.serverName },
      { label: '服务监听端口', value: handleData.port },
      { label: '处置结果', value: handleData.status === 'fix' ? '已修复' : '未修复' }
    ],
    // web应用漏洞
    WEB_VUL: [
      { label: '设备标识', value: handleData.node },
      { label: '漏洞类型', value: handleData.vulType },
      { label: '漏洞名称', value: handleData.vulName },
      { label: '漏洞地址', value: handleData.url },
      { label: '漏洞描述', value: handleData.desc },
      { label: '漏洞解决方案', value: handleData.solution },
      { label: '处置结果', value: handleData.status === 'fix' ? '已修复' : '未修复' }
    ],
    // 审计
    'DEV-AUDIT': [
      { label: '远程IP', value: handleData.clientIp },
      { label: '操作用户', value: handleData.user },
      { label: '用户权限', value: handleData.roles },
      { label: '用户操作', value: handleData.action },
      { label: '操作结果', value: handleData.result },
      { label: '日志来源', value: handleData.logSource }
    ],
    // 违规外联
    'ILLEGAL-ACCESSS': [
      { label: '外联访问地址', value: handleData.url },
      { label: '处置动作', value: handleData.action },
      { label: '通讯报文内容', value: handleData.msg },
      { label: '主机地址唯一标识', value: handleData.host },
      { label: '涉及载荷文件传输', value: handleData.md5 }
    ],
    // 违规接入
    'ILLEGAL-USE': [
      { label: '被接入主机', value: handleData.host },
      { label: '接入设备名称', value: handleData.devName },
      { label: '设备唯一标识', value: handleData.devId },
      { label: '处置动作', value: handleData.action },
      { label: '操作', value: handleData.op },
      { label: '涉及载荷文件', value: handleData.md5 }
    ],
    // 系统运行状态
    'SYS-STATUS': [
      { label: '系统名称', value: handleData.sysName },
      { label: '系统唯一标识', value: handleData.sysId },
      { label: '系统在用状态', value: handleData.status === 1 ? '可用' : '不可用' },
      { label: '系统上线时间', value: handleData.uptime },
      { label: '自上线以来运行时间', value: `${handleData.runtime}天` },
      { label: '系统当前状态描述', value: handleData.desc }
    ],
    // 设备运行状态
    'DEV-STATUS': [
      { label: '设备名称', value: handleData.devName },
      { label: '设备唯一标识', value: handleData.node },
      { label: '设备在用状态', value: handleData.status === 1 ? '可用' : '不可用' },
      { label: '系统上线时间', value: handleData.uptime },
      { label: '设备当前状态描述', value: handleData.desc }
    ]
  }
  // 系统信息
  const sysInfo = [
    { label: '系统名称', value: handleData.sysInfoName },
    { label: '系统代码', value: handleData.sysInfoCode },
    { label: 'url地址', value: handleData.sysInfoUrl },
    { label: '所属区域', value: handleData.sysInfoBelongArea },
    { label: '所属机构', value: handleData.sysInfoUnit },
    { label: '标签', value: handleData.sysInfoTag },
    { label: '维护人', value: handleData.sysInfoMaintainer },
    { label: '维护人电话', value: handleData.sysInfoMaintainerPhone },
    { label: '维护人邮箱', value: handleData.sysInfoMaintainerEmail },
    { label: '备注', value: handleData.sysInfoRemark },
    { label: '创建时间', value: handleData.sysInfoUptime },
    { label: '系统描述', value: handleData.sysInfoDesc }
  ]
  // 系统节点信息 待确定
  const nodeInfo = [
    { label: '节点名称', value: handleData.nodeInfoName },
    { label: '节点代码', value: handleData.nodeInfoCode },
    { label: '节点标签', value: handleData.nodeInfoTag },
    { label: '节点类型', value: handleData.nodeInfoNodeType },
    { label: '操作系统', value: handleData.nodeInfoOperateSystem },
    { label: '等保级别', value: handleData.nodeInfoLevel },
    { label: 'DNS', value: handleData.nodeInfoDns },
    { label: '所属机构', value: handleData.nodeInfoAgencyName },
    { label: '维护人', value: handleData.nodeInfoMaintainer },
    { label: '维护人电话', value: handleData.nodeInfoMaintainerPhone },
    { label: '维护人邮箱', value: handleData.nodeInfoMaintainerEmail },
    { label: '是否注册', value: handleData.nodeInfoIsRegister === '是' ? '已注册' : '未注册' },
    { label: '创建时间', value: handleData.nodeInfoUptime },
    { label: '节点描述', value: handleData.nodeInfoSysNodeDes }
  ]
  // 山包记录
  const report = [
    { label: '日志ID', value: handleData.id },
    { label: '上报时间', value: handleData.rTime },
    { label: '上报单位', value: handleData.sysInfoUnit }
  ]
  // 根据日志小类型返回相应结构
  return {
    monitor: monitor[stype] || [],
    sysInfo: handleData.sysInfoVisible ? sysInfo : [],
    report: report,
    nodeInfo: handleData.nodeInfoVisible ? nodeInfo : []
  }
}
// 转义
export const escapeStr = str => {
  return str.replace(/\[|\]|\\|"|\+|-|=|&|>|<|!|\(|\)|\{|\}|\^|~|\*|\?|:/g, function (word) {
    return `\\${word}`
  })
}

// 筛选条件
export const getEsSearchFilter = (type, key, firstLevelKey) => {
  if (type === 'nested') {
    return function (choose) {
      let ans = []
      for (let i in choose) {
        ans.push({
          query_string: {
            query: `${key}:${choose[i]}`
          }
        })
      }
      if (ans.length > 0) {
        return {
          nested: {
            path: firstLevelKey,
            query: {
              bool: {
                must: ans
              }
            }
          }
        }
      } else return []
    }
  } else if (type === 'normal') {
    return function (choose) {
      let ans = []
      for (let i in choose) {
        ans.push({
          term: {
            [key]: {
              value: `${choose[i]}`
            }
          }
        })
      }
      if (ans.length > 0) {
        return {
          bool: {
            should: ans,
            minimum_should_match: 1
          }
        }
      } else return []
    }
  }
}

export const getEsSearchGroup = (type, key, firstLevelKey) => {
  if (type === 'nested') {
    return function (key) {
      return {
        groupData: {
          nested: {
            path: firstLevelKey
          },
          aggs: {
            groupData: {
              terms: {
                field: key,
                size: 20,
                exclude: ['']
              }
            }
          }
        }
      }
    }
  } else if (type === 'normal') {
    return function (key) {
      return {
        groupData: {
          terms: {
            field: key,
            size: 20
            // exclude: ['']
          }
        }
      }
    }
  } else if (type === 'map') {
    return function (key) {
      return {
        groupData: {
          terms: {
            field: key,
            size: 20,
            exclude: ['']
          },
          aggs: {
            lat: {
              terms: {
                field: `${key.split('.')[0]}.location.lat`,
                size: 1
              }
            },
            lon: {
              terms: {
                field: `${key.split('.')[0]}.location.lon`,
                size: 1
              }
            }
          }
        }
      }
    }
  }
}
